package com.xiaobias.day004;

/**
 * @author <a href="mailto:197772517@qq.com">longw.dr</a>
 * @date 2023-11-10 11-21
 * @since 1.0
 */
public class ValidatedAndValidTest {
    // @Valid和@Validated注解校验以及异常处理
    // Java生态下的@valid注解配置

    // @Valid注解
    // @Valid注解可以作用于：方法、属性（包括枚举中的常量）、构造函数、方法的形参上。
    /*
        @Target({ElementType.METHOD, ElementType.FIELD, ElementType.CONSTRUCTOR, ElementType.PARAMETER, ElementType.TYPE_USE})
        @Retention(RetentionPolicy.RUNTIME)
        @Documented
        public @interface Valid {
        }
     */
    // 所属的包 import javax.validation.Valid;
    // 空校验
    // @Null	    用于基本类型上，限制只能为null
    // @NotNull	    用在基本类型上；不能为null，但可以为empty,没有Size的约束
    // @NotEmpty    用在集合类上面；不能为null，而且长度必须大于0
    // @NotBlank	只能作用在String上，不能为null，而且调用trim()后，长度必须大于0
    /*
        插播一条小内容！！！null和empty有何区别？
        String a = new String
        String b = ""
        String c = null
     */
    // 1.此时a是分配了内存空间，但值为空，是绝对的空，是一种有值（值存在为空而已）
    // 2.此时b是分配了内存空间，值为空字符串，是相对的空，是一种有值（值存在为空字串）
    // 3.此时c是未分配内存空间，无值，是一种无值(值不存在)

    // Boolean校验
    // @AssertFalse	限制必须为false
    // @AssertTrue	限制必须为true

    // 长度校验
    // @Size(max,min)	验证对象（Array,Collection,Map,String）长度是否在给定的范围之内
    // @Length(min=, max=)	验证字符串长度是否在给定的范围之内

    // 日期校验
    // @Past	限制必须是一个过去的日期, 并且类型为 java.util.Date
    // @Future	限制必须是一个将来的日期, 并且类型为 java.util.Date
    // @Pattern(value)	限制必须符合指定的正则表达式

    // 数值校验
    // 建议使用在Stirng,Integer类型，不建议使用在int类型上，因为表单值为“”时无法转换为int，但可以转换为Stirng为"",Integer为null。
    // @Min(value)	验证 Number 和 String 对象必须为一个不小于指定值的数字
    // @Max(value)	验证 Number 和 String 对象必须为一个不大于指定值的数字
    // @DecimalMax(value)	限制必须为一个不大于指定值的数字,小数存在精度
    // @DecimalMin(value)	限制必须为一个不小于指定值的数字,小数存在精度
    // @Digits(integer,fraction)	限制必须为一个小数，且整数部分的位数不能超过integer，小数部分的位数不能超过fraction
    // @Digits	验证 Number 和 String 的构成是否合法
    // @Range(max =3 , min =1 , message = " ")	Checks whether the annotated value lies between (inclusive) the specified minimum and maximum
    // Max和Min是对你填的“数字”是否大于或小于指定值，这个“数字”可以是number或者string类型。长度限制用length。

    // 其他校验
    // @Email	验证注解的元素值是Email，也可以通过正则表达式和flag指定自定义的email


    //使用 @Valid 进行参数效验步骤：
    // 1. 实体类中添加 @Valid 相关注解
    // 2. 接口类中添加 @Valid 注解
    // 3. 全局异常处理类中处理 @Valid 抛出的异常

    // 运行流程
    // 用户访问接口，然后进行参数效验，因为 @Valid 不支持平面的参数效验（直接写在参数中字段的效验）所以基于 GET 请求的参数还是按照原先方式进行效验，而 POST 则可以以实体对象为参数，可以使用 @Valid 方式进行效验。如果效验通过，则进入业务逻辑，否则抛出异常，交由全局异常处理器进行处理。
}
